package h_eekwan.basic; 

	// 302P. 02번
public class J16_Calculrator {
	public static void main(String[] args) {	
		// 상속, 인터페이스, 기본클래스를 이용해서
		// 사칙연산을 수행하는 계산기 프로그램 작성
		J16Add add = new J16Add();
		add.setValue(3, 7);
		System.out.println(add.toString());
		System.out.println(add.calculate());
		
		
		J16Mul mul = new J16Mul();
		mul.setValue(7, 7);
		System.out.println(mul.toString());
		System.out.println(mul.calculate());
		// +, x 연산을 위해
		// J16Add, J16Mul 객체를 생성했음
		// 하지만, -, / 연산을 위해
		// J16Sub, J16Div 객체도 생성해야 함
		// 사칙연산을 위해 불필요한 객체를 생성하는
		// 불편함, 낭비가 발생
		// 해결책 - 상위자료형변환 upcasting을 이용
		
		J16Cal c = new J16Add();
		c.setValue(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		c = new J16Mul();
		c.setValue(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		// +, x 연산을 위해 J16Add, J16Mul의
		// 부모인 J16Cal 객체만 생성
		// 추후 -, / 연산을 위해
		// J16Sub, J16Div 객체를 생성하더라도
		// 부모인 J16Cal 객체만 가져다 쓰면 됨
		c = new J16Sub();
		c.setValue(5, 10);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		c = new J16Div();
		c.setValue(10, 2);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
	}	// main
}	//class

// 인터
interface J16CalService {
	void setValue(int x, int y);
	int calculate();
	
}
class J16Cal implements J16CalService{
	private int x;
	private int y;
	
	public J16Cal () {}
	
	// 멤버변수 x, y의 초기화 작업은
	// setValue 메서드가 대신하므로 ( 아래에 보면 초기화작업 했음 )
	// 생성자는 주석 처리함
	public J16Cal ( int x, int y){
		this.x = x;
		this.y = y;		
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	@Override
	public String toString() {
		return "J16Cal [ x =" + x + ", y = " + y + "]";
	}
	
	@Override
	public void setValue(int x, int y) {
		this.x = x;
		this.y = y;						// 초기화 작업	
	}
	@Override
	public int calculate() {	
		return 0;
	}
	
	
	
}
class J16Add extends J16Cal {
		
	@Override
	public int calculate() {
		return getX() + getY();
	}
}
class J16Mul extends J16Cal {
	@Override
	public int calculate() {
		return getX() * getY();
	}
}
class J16Sub extends J16Cal {
	@Override
	public int calculate() {
		
		if(getX() > getY())
		return getX() - getY();
		else return getY() - getX();	
	}
	
}
class J16Div extends J16Cal{
	@Override
	public int calculate() {
		
		return getX() / getY();
	}
}
